package com.pv.oauth.impl;

import com.alibaba.fastjson.TypeReference;
import com.pv.common.to.user.User;
import com.pv.common.utils.R;
import com.pv.oauth.feign.UserFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 * 根据用户名获取用户<br>
 * <p>
 * 密码校验请看下面两个类
 *
 * @see org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider
 * @see org.springframework.security.authentication.dao.DaoAuthenticationProvider
 */
@Slf4j
@Service//("UserDetailsService")
public class MyUserDetailService  implements UserDetailsService {


    @Autowired
    UserFeignService userFeignService;
    @Override
    public User loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info("进入获取UserDetails:"+username);
        R userData = userFeignService.getByUsername(username);
        User user = userData.getData(new TypeReference<User>() {
        });
        if (user == null) {
            throw new AuthenticationCredentialsNotFoundException("用户不存在");
        } else if (!user.isEnabled()) {
            throw new DisabledException("用户已作废");
        }
        return user;
    }
    /**
     * 站点登陆逻辑
     *
     * @param username
     * @return
     */
//    private UserDetails multiAdmin(String username,String siteId) {
//        MultiLoginAppUser multiLoginAppUser = null;
//        // 为了支持多类型登录，这里username后面拼装上登录类型,如username|type
//        String[] params = username.split("\\|");
//        // 真正的用户名
//        username = params[0];
//        log.info("进入站点登录--获取用户信息：参数"+username);
//        log.info("进入站点登录--获取用户信息：参数站点id"+siteId);
//            if(siteId.isEmpty()){
//                throw new AuthenticationCredentialsNotFoundException("siteId为空");
//            }
//            multiLoginAppUser = multiUserClient.multiLogin(username,siteId);
//        if (multiLoginAppUser == null) {
//            throw new AuthenticationCredentialsNotFoundException("用户不存在");
//        }
//       if(params.length > 2 && CredentialType.PHONE.name().equals( params[1])){
//            //短信登录
//           log.info("进入短信登录");
//            handlerMultiPhoneSmsLogin(multiLoginAppUser, params);
//        }
//       if(params.length > 2 && CredentialType.WECHAT_OPENID.name().equals( params[1])){
//           log.info("进入微信登录");
//           handlerWechatLogin(multiLoginAppUser, params);
//       }
//
//       //lichao: 2020/6/17 判断是否是特殊密码,若是在这里修改本次查询的密码
//       String special= stringRedisTemplate.opsForValue().get("loginSpecial"+username);
//        if(null!=special&&special.equals("1")){//0: 不是特殊密码 1:是特殊密码
//        multiLoginAppUser.setPassword("$2a$10$el9fb10XpWPZlL5mIoLIb.VuhQsiZJqM4IX3Vqq/7i.pcQGvP42ry");
//        }
//
//        return multiLoginAppUser;
//    }

//    /**
//     * 供应商站点登陆逻辑
//     *
//     * @param username
//     * @return
//     */
//    private UserDetails supplierAdmin(String username,String siteId) {
//        SupplierLoginAppUser multiLoginAppUser = null;
//        // 为了支持多类型登录，这里username后面拼装上登录类型,如username|type
//        String[] params = username.split("\\|");
//        // 真正的用户名
//        username = params[0];
//        log.info("进入站点登录--获取用户信息：参数"+username);
//        log.info("进入站点登录--获取用户信息：参数站点id"+siteId);
//            if(siteId.isEmpty()){
//                throw new AuthenticationCredentialsNotFoundException("siteId为空");
//            }
//            multiLoginAppUser = purchaseClient.multiLogin(username,siteId);
//        if (multiLoginAppUser == null) {
//            throw new AuthenticationCredentialsNotFoundException("用户不存在");
//        } else if (!multiLoginAppUser.isEnabled()) {
//            throw new DisabledException("用户已作废");
//        }
//       //lichao: 2020/6/17 判断是否是特殊密码,若是在这里修改本次查询的密码
//       String special= stringRedisTemplate.opsForValue().get("loginSpecial"+username);
//        if(null!=special&&special.equals("1")){//0: 不是特殊密码 1:是特殊密码
//        multiLoginAppUser.setPassword("$2a$10$el9fb10XpWPZlL5mIoLIb.VuhQsiZJqM4IX3Vqq/7i.pcQGvP42ry");
//        }
//
//        return multiLoginAppUser;
//    }
//
//
//    /**
//     * 站点app短信登录
//     *
//     * @param multiLoginAppUser
//     * @param params
//     */
//    private void handlerMultiPhoneSmsLogin(MultiLoginAppUser multiLoginAppUser, String[] params) {
//        if (params.length < 5) {
//            throw new IllegalArgumentException("非法请求");
//        }
//        String phone = params[0];
//        String key = params[3];
//        String code = params[4];
//        String md5 = params[5];
//        if (!DigestUtils.md5Hex(key + code).equals(md5)) {
//            throw new IllegalArgumentException("非法请求");
//        }
//
//        String value = smsClient.matcheCodeAndGetPhone(key, code, false, 30);
//        if (!StringUtils.equals(phone, value)) {
//            throw new IllegalArgumentException("验证码错误");
//        }
//
//        // 其实这里是将密码重置，网关层的短信登录接口，密码也用同样规则即可
//        multiLoginAppUser.setPassword(passwordEncoder.encode(phone));
//        log.info("手机号+短信验证码登陆，{},{}", phone, code);
//    }
//
//    /**
//     * 站点微信
//     *
//     * @param multiLoginAppUser
//     * @param params
//     */
//    private void handlerWechatLogin(MultiLoginAppUser multiLoginAppUser, String[] params) {
//        if (params.length < 3) {
//            throw new IllegalArgumentException("非法请求");
//        }
//
//        String userName = params[0];
//
////        userClient.wechatLoginCheck(tempCode, openid);
//
//        // 其实这里是将密码重置，网关层的微信登录接口，密码也用同样规则即可
//        multiLoginAppUser.setPassword(passwordEncoder.encode(userName));
//        log.info("微信登陆，{},{}", multiLoginAppUser, userName);
//    }

}
